-------------------------------------------------------------------------------------------------------
-- Funcion para actualizar precios por rubro para una variable de precios e incorporar articulos nuevos 
-------------------------------------------------------------------------------------------------------


CREATE OR REPLACE FUNCTION abaco_utiles.actualizar_articulos_y_precios_xrubro(
	character varying,
	character varying,
	character varying,
	character varying,
	integer)
RETURNS boolean AS 

$BODY$
DECLARE   
varbol                  ALIAS FOR $1;
vrubro   		ALIAS FOR $2;
vprecio   		ALIAS FOR $3;
vcuit   		ALIAS FOR $4;
vruta                   ALIAS FOR $5; 

vcont                   integer;
vaceptaitem             varchar(1);
vprefijo                varchar(4); 
vraiz                   varchar(20);

vcadena 	character varying;
vservidor character varying;

BEGIN
-- Esta funcion permite actualizar precios y agrgar articulos de un rubro y para una variable de precios 

-- Los dos primeros parametros corresponden a arbol y rubro.
-- El tercer parametro al codigo de la variable de precio que se va a actualizar. 
-- El cuarto parametro es el cuit del cliente que es obligatorio para el caso que la base no sea local 
-- El quinto parametro se utiliza para indicar la ruta desde donde se leera el archivo csv con los precios:
--  1  para bases locales 
--  2  para bases en Hosting
--  3  para bases en Datacenter (fibercorp) 

-- El archivo debe venir en formato csv, delimitado por ';' y sin titulos. 
-- Los campos de la lista corresponden al codigo de articulo, la decripcion y al precio de la variable ingresada como parametro
-- El archivo correspondiente a la lista se debe llamar 'precios.csv' y para las bases locales dede estar en la 
-- carpeta 'c:/abaco/gestion/listas' 

-- Los articulos estan cargados en abaco con el codigo que usa el proveedor, precedido por un prefijo de cuatro posiciones en total. 
-- Ese prefijo es el que tiene el rubro raiz correspondiente al rubro ingresado como parametro.
-- La variable de precios que se actualiza viene indicada en el tercer parámetro.

--- SOLO MODIFICA PRECIOS. NO AGREGA ARTICULOS ---

SET CLIENT_ENCODING TO LATIN1;

select count(*) from artr where tipoarta = varbol and cod = vrubro into vcont;
if vcont = 0 then 
   RAISE EXCEPTION 'No existe el rubro ingresado'; 
end if;

if trim(vcuit) = '' and vruta <> 1 then
   RAISE EXCEPTION 'Debe ingresar el cuit del cliente, separado por guiones'; 
end if;

if vruta not in (1, 2, 3) then
   RAISE EXCEPTION 'El servidor debe corresponder a los codigis 1, 2 o 3';
end if;

--Busca el rubro raiz correspondiente al rubro que se ingreso porque es el que tiene cargado el prefijo valido para
--todos los subrubros que decienden de el,

select str_al_punto(vrubro, 1) into vraiz;

select preitem from artr where tipoarta = varbol and cod = vraiz  into vprefijo;

CREATE TABLE abaco_utiles.renglones (  renglon character varying(1000) ) WITH ( OIDS=TRUE );

-- La lista viene en formato csv, delimitado por ';' y sin titulos. Los campos corresponden a codart, detalle y precio.

if vruta = 1 then
   copy abaco_utiles.renglones from 'c:/abaco/gestion/listas/precios.csv';
  else
    if vruta = 2 then
       vservidor:= '/var/www/html/implementacion_datos/clientes/'; -- Hosting
     else
       vservidor:= '/datacenter/var/www/html/implementacion_datos/clientes/'; -- Datacenter (fibercorp)
    end if;
    vcadena:= 'copy abaco_utiles.renglones from ''' || vservidor || vcuit || '/' || 'precios.csv' || '''';
    EXECUTE vcadena; 
end if;

-- Elimino las lineas que no tienen codigo --

DELETE FROM abaco_utiles.renglones renglones where trim(split_part(renglon, ';', 1)) = ''; 

CREATE TABLE abaco_utiles.lista

(
  idart integer, 
  codigo character varying(30),
  nombre character varying(100),
  precio numeric(16,2), 
  es_nuevo character
)
WITH (OIDS=TRUE);
ALTER TABLE abaco_utiles.lista OWNER TO abacouser;


CREATE TABLE abaco_utiles.repetidos
(
  codigo	character varying(50),
  ocurrencias   integer
)
WITH (OIDS=TRUE);

INSERT INTO abaco_utiles.lista(codigo, nombre, precio, es_nuevo)
SELECT trim(split_part(renglon, ';', 1)) as codigo, 
       substring(trim(split_part(renglon, ';', 2)), 1, 100) as nombre,
       str_a_nro(trim(split_part(renglon, ';', 3))) as precio, 
       'S' as es_nuevo
FROM abaco_utiles.renglones
ORDER BY oid;

-- Se borran los articulos repetidos para que lueego no de error el insert en la tabla prexart

insert into abaco_utiles.repetidos (codigo, ocurrencias)
select codigo, count(*) from abaco_utiles.lista
group by codigo
having count(*) > 1;

delete from abaco_utiles.lista where codigo in (select codigo from abaco_utiles.repetidos);

-- Eliminamos los blancos de las puntas....
update abaco_utiles.lista set codigo = trim(codigo) where codigo <> trim(codigo);

-- Reemplazamos el blanco doble por uno, varias veces, hasta que no modifique ninguno...
update abaco_utiles.lista set codigo = replace(codigo, '    ', ' ') where codigo <> replace(codigo, '    ', ' ');
update abaco_utiles.lista set codigo = replace(codigo, '  ', ' ') where codigo <> replace(codigo, '  ', ' ');
update abaco_utiles.lista set codigo = replace(codigo, '  ', ' ') where codigo <> replace(codigo, '  ', ' ');
update abaco_utiles.lista set codigo = replace(codigo, '  ', ' ') where codigo <> replace(codigo, '  ', ' ');
update abaco_utiles.lista set codigo = replace(codigo, '  ', ' ') where codigo <> replace(codigo, '  ', ' ');

-- Obtengo el idart para los que estan en abaco.   

UPDATE abaco_utiles.lista SET idart = art.id, es_nuevo = 'N'
FROM art
WHERE art.cod = (vprefijo || lista.codigo) and art.tipoarta = varbol and art.codartr like (vrubro ||'%') ;     

UPDATE abaco_utiles.lista SET idart = getnextid('art') where es_nuevo = 'S';

-- Inserto los articulos que no estan.
INSERT INTO art(id, cod, nombre, tipoarta, codartr, ubicacion, infobrowser,
                              calccant, registrastock, modifnombre, puederegalar, stkcomp, 
                              accesosucursales, cantlinea, accesousuarios) 
SELECT idart, (vprefijo || lista.codigo), nombre, 'A', vrubro, null as ubicacion, null as infobrowser, 
               'N' as calccant, 'S' as registrastock, 'N' as modifnombre, 'N' as puederegalar, 'N' as stkcomp, 
               '*' as accesosucursales, 'U' as cantlinea, '*' as accesousuarios
FROM abaco_utiles.lista
WHERE es_nuevo = 'S'
ORDER BY idart;

-- Se modifican los prexart que ya existian 

UPDATE prexart pxa set valor = abaco_utiles.lista.precio
FROM abaco_utiles.lista
WHERE (cast(abaco_utiles.lista.precio as numeric(16,2)) <> cast(pxa.valor as numeric(16,2)))
      and pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio)
	  and abaco_utiles.lista.es_nuevo = 'N';

-- Se agregan los nuevo prexart

INSERT INTO prexart(idpre, idart, valor)
SELECT (select id from pre where cod = vprecio), abaco_utiles.lista.idart, abaco_utiles.lista.precio
FROM abaco_utiles.lista 
WHERE abaco_utiles.lista.precio > 0  
      and NOT EXISTS (select * from prexart pxa where pxa.idart = abaco_utiles.lista.idart and pxa.idpre = (select id from pre where cod = vprecio))
ORDER BY abaco_utiles.lista.idart;

RETURN true;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION abaco_utiles.actualizar_articulos_y_precios_xrubro(character varying, character varying, character varying, character varying, integer)
    OWNER TO abacouser;


------------------------------------
select aaVersion('498.07','498.06');
------------------------------------
